#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
long long T,n,m,L,V,d[MAXN],v[MAXN],a[MAXN],p[MAXN],pt[MAXN];
int over,ans;
bool ccf,flag;
int qread(){
    int x=0;
    char c=getchar();
    int f=1;
    for(;!isdigit(c);c=getchar()){
        if(c=='-'){
            f=-1;
        }
    }
    for(;isdigit(c);c=getchar()){
        x=(x<<3)+(x<<1)+(c^48);
    }
    return x*f;
}
int all(){
    int cnt=0;
    for(int i=1;i<=n;i++){
        bool mark=false;
        for(int j=1;j<=m;j++){
            if(p[j]>=d[i]){
                if((v[i]*v[i]+2*a[i]*(p[j]-d[i]))>V*V){
                    mark=true;
                    break;
                }
            }
        }
        if(mark){
            cnt++;
        }
    }
    return cnt;
}
bool check(){
    int cnt=0;
    for(int i=1;i<=n;i++){
        bool mark=false;
        for(int j=1;j<=m;j++){
            if(pt[j]>=d[i]&&pt[j]>=0){
                if((v[i]*v[i]+2*a[i]*(pt[j]-d[i]))>V*V){
                    mark=true;
                    break;
                }
            }
        }
        if(mark){
            cnt++;
        }
    }
    if(cnt==over){
        return true;
    }
    else{
        return false;
    }
}
void dfs(int cnt_dfs){
    if(cnt_dfs>ans){
        ans=cnt_dfs;
    }
    for(int i=1;i<=m;i++){
        if(pt[i]>=0){
            pt[i]=-1;
            if(check()){
                cnt_dfs++;
                dfs(cnt_dfs);
                cnt_dfs--;
            }
            pt[i]=p[i];
        }
    }
}
void close(){
    for(int i=1;i<=m;i++){
        pt[i]=p[i];
    }
    dfs(0);
}
int a0(){
    int cnt_a0=0;
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(p[m]>=d[i]){
            cnt_a0++;
            if(v[i]>V){
                cnt++;
            }
        }
    }
    if(cnt_a0==0){
        ccf=true;
    }
    return cnt;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    T=qread();
    for(int i=1;i<=T;i++){
        n=qread();
        m=qread();
        L=qread();
        V=qread();
        for(int j=1;j<=n;j++){
            d[j]=qread();
            v[j]=qread();
            a[j]=qread();
            if(a[j]!=0){
                flag=true;
            }
        }
        for(int j=1;j<=m;j++){
            p[j]=qread();
        }
        if(flag==false){
            over=a0();
            printf("%d ",over);
            if(ccf==true||over==0){
                ans=m;
            }
            else{
                ans=m-1;
            }
            printf("%d\n",ans);
        }
        else{
            over=all();
            printf("%d ",over);
            close();
            printf("%d\n",ans);
            ans=0;
        }
    }
    return 0;
}
